package pruebas;

import java.util.ArrayList;
import junit.framework.TestCase;
import juego.AvionCivil;
import juego.Botin;
import juego.Caza;
import juego.Cohete;
import juego.Energia;
import juego.ExcepcionMismoElemento;
import juego.Explorador;
import juego.Helicoptero;
import juego.Impacto;
import juego.Coordenada;
import juego.Laser;
import juego.Movil;


public class TestExplorador extends TestCase{
	
	public void testColision(){
		
		ArrayList<Movil> listaDeMoviles = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		
		Explorador explorador = new Explorador(0,20);
		Coordenada ubicacionLaser1 = new Coordenada(20,0);
		Laser laser1 = new Laser(ubicacionLaser1);
		Coordenada ubicacionLaser2 = new Coordenada(0,-20);
		Laser laser2 = new Laser(ubicacionLaser2);
		laser1.hacerLeal();
		laser2.hacerLeal();
		
		listaDeMoviles.add(explorador);
		listaDeMoviles.add(laser1);
		listaDeMoviles.add(laser2);
		
		for(int i = 1; i <= 4; i++){
			explorador.vivir(listaDeMoviles,listaDeBotines);
		};
		
		int puntaje = explorador.vivir(listaDeMoviles,listaDeBotines);
		assertTrue(listaDeMoviles.contains(explorador));
		assertFalse(listaDeMoviles.contains(laser1));
		assertTrue(puntaje == 0);
		
		for(int i = 1; i <= 4; i++){
			explorador.vivir(listaDeMoviles,listaDeBotines);
		};
		
		puntaje = explorador.vivir(listaDeMoviles,listaDeBotines);
		assertFalse(listaDeMoviles.contains(explorador));
		assertFalse(listaDeMoviles.contains(laser2));
		assertTrue(puntaje == 50);
		
	};
	
	public void testColisionSimultanea(){
		
		ArrayList<Movil> listaDeMoviles = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		
		Coordenada ubicacionExplorador = new Coordenada(0,20);
		Explorador explorador = new Explorador(ubicacionExplorador);
		Coordenada ubicacionLaser = new Coordenada(20,0);
		Laser laser = new Laser(ubicacionLaser);
		Coordenada ubicacionCohete = new Coordenada(21,0);
		Cohete cohete = new Cohete(ubicacionCohete);
		laser.hacerLeal();
		cohete.hacerLeal();
		
		listaDeMoviles.add(explorador);
		listaDeMoviles.add(laser);
		listaDeMoviles.add(cohete);
		
		for(int i = 1; i <= 4; i++){
			explorador.vivir(listaDeMoviles,listaDeBotines);
		};
		
		int puntaje = explorador.vivir(listaDeMoviles,listaDeBotines);
		assertFalse(listaDeMoviles.contains(explorador));
		assertFalse(listaDeMoviles.contains(laser));
		assertFalse(listaDeMoviles.contains(cohete));
		assertTrue(puntaje == 50);
	};

	public void testImpactoProvocado(){
		
		Movil movil = new Explorador(0,8);
		Energia energia = new Energia(30);
		Impacto impacto = movil.impactoProvocado();
		impacto.herir(energia);
		assertEquals(15, energia.verEnergia());
		
	};	
	public void testMovimientoYColision(){
	
		ArrayList<Movil> listaDeMoviles = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		
		Coordenada ubicacion = new Coordenada(0,20);
		Explorador explorador = new Explorador(ubicacion);
		Helicoptero helicoptero1 = new Helicoptero(20,0);
		Helicoptero helicoptero2 = new Helicoptero(0,-20);
		Helicoptero helicoptero3 = new Helicoptero(-20,2);
		Helicoptero helicoptero4 = new Helicoptero(11,16);
		
		assertEquals(0,explorador.verUbicacion().obtenerCoordenadaX());
		assertEquals(20,explorador.verUbicacion().obtenerCoordenadaY());
		
		try{
		assertTrue(explorador.huboContacto(helicoptero1) == false);
		}
		catch(ExcepcionMismoElemento excepcion){
			assertTrue(true);
		};
		try{
		assertTrue(explorador.huboContacto(helicoptero2) == false);
		}
		catch(ExcepcionMismoElemento excepcion){
			assertTrue(true);
		};
		try{
		assertTrue(explorador.huboContacto(helicoptero3) == false);
		}
		catch(ExcepcionMismoElemento excepcion){
			assertTrue(true);
		};
		try{
		assertTrue(explorador.huboContacto(helicoptero4) == false);
		}
		catch(ExcepcionMismoElemento excepcion){
			assertTrue(true);
		};
		
		listaDeMoviles.add(explorador);
		listaDeMoviles.add(helicoptero1);
		listaDeMoviles.add(helicoptero2);
		listaDeMoviles.add(helicoptero3);
		listaDeMoviles.add(helicoptero4);
		
		for(int i = 1; i <= 5; i++){
			explorador.vivir(listaDeMoviles,listaDeBotines);
		};
		
		assertEquals(20,explorador.verUbicacion().obtenerCoordenadaX());
		assertEquals(0,explorador.verUbicacion().obtenerCoordenadaY());
		
		try{
		assertTrue(explorador.huboContacto(helicoptero1) == true);
		}
		catch(ExcepcionMismoElemento excepcion){
			assertTrue(true);
		};
		
		assertTrue(explorador.estaVivo());
		assertTrue(helicoptero1.estaVivo());
		
		for(int i = 1; i <= 5; i++){
			explorador.vivir(listaDeMoviles,listaDeBotines);
		};
		
		assertEquals(0,explorador.verUbicacion().obtenerCoordenadaX());
		assertEquals(-20,explorador.verUbicacion().obtenerCoordenadaY());
		
		try{
		assertTrue(explorador.huboContacto(helicoptero2) == true);
		}
		catch(ExcepcionMismoElemento excepcion){
			assertTrue(true);
		};
		
		assertTrue(explorador.estaVivo());
		assertTrue(helicoptero2.estaVivo());
		
		for(int i = 1; i <= 5; i++){
			explorador.vivir(listaDeMoviles,listaDeBotines);
		};
		
		assertEquals(-20,explorador.verUbicacion().obtenerCoordenadaX());
		assertEquals(0,explorador.verUbicacion().obtenerCoordenadaY());
		
		try{
		assertTrue(explorador.huboContacto(helicoptero3) == true);
		}
		catch(ExcepcionMismoElemento excepcion){
			assertTrue(true);
		};
		
		assertTrue(explorador.estaVivo());
		assertTrue(helicoptero3.estaVivo());
		
		int puntaje = 0;
		for(int i = 1; i <= 7; i++){
			puntaje = explorador.vivir(listaDeMoviles,listaDeBotines);
		};
		
		assertEquals(11,explorador.verUbicacion().obtenerCoordenadaX());
		assertEquals(16,explorador.verUbicacion().obtenerCoordenadaY());
		
		
		try{
		assertTrue(explorador.huboContacto(helicoptero4) == true);
		}
		catch(ExcepcionMismoElemento excepcion){
			assertTrue(true);
		};
		
		assertTrue(explorador.estaVivo());
		assertTrue(helicoptero4.estaVivo());
		assertTrue(puntaje == 0);
	};
	
	public void testProvocarHuida(){
		
		ArrayList<Movil> listaDeMoviles = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		
		Coordenada ubicacion = new Coordenada(0,20);
		Explorador explorador = new Explorador(ubicacion);
		explorador.designarGuia();
		Coordenada ubicacionLaser = new Coordenada(20,0);
		Laser laser = new Laser(ubicacionLaser);
		Coordenada ubicacionCohete = new Coordenada(21,0);
		Cohete cohete = new Cohete(ubicacionCohete);
		laser.hacerLeal();
		cohete.hacerLeal();
		
		Coordenada ubicacionExplorador2 = new Coordenada(-5,-5);
		Explorador explorador2 = new Explorador(ubicacionExplorador2);
		Coordenada ubicacionCaza = new Coordenada(-15,-15);
		Caza caza = new Caza(ubicacionCaza);
		AvionCivil avionCivil = new AvionCivil(-100,-100);
		Coordenada ubicacionLaser2 = new Coordenada(100,100);
		Laser laser2 = new Laser(ubicacionLaser2);
		
		listaDeMoviles.add(avionCivil);
		listaDeMoviles.add(explorador2);
		listaDeMoviles.add(laser);
		listaDeMoviles.add(explorador);
		listaDeMoviles.add(laser2);
		listaDeMoviles.add(caza);
		listaDeMoviles.add(cohete);
		
		//destruccion
		for(int i = 1; i <= 4; i++){
			explorador.vivir(listaDeMoviles,listaDeBotines);
		};
		int puntaje = explorador.vivir(listaDeMoviles,listaDeBotines);
		assertFalse(explorador.estaVivo());
		assertFalse(listaDeMoviles.contains(explorador));
		assertFalse(laser.estaVivo());
		assertFalse(listaDeMoviles.contains(laser));
		assertFalse(cohete.estaVivo());
		assertFalse(listaDeMoviles.contains(cohete));
		assertTrue(puntaje == 50);
		
		//huida
		//siguen igual
		avionCivil.vivir(listaDeMoviles, listaDeBotines);
		assertEquals (-95, avionCivil.verUbicacion().obtenerCoordenadaX());
		assertEquals (-100, avionCivil.verUbicacion().obtenerCoordenadaY());
		laser2.vivir(listaDeMoviles, listaDeBotines);
		assertEquals (100, laser2.verUbicacion().obtenerCoordenadaX());
		assertEquals (110, laser2.verUbicacion().obtenerCoordenadaY());
		
		//huyen
		explorador2.vivir(listaDeMoviles,listaDeBotines);
		assertEquals (-5, explorador2.verUbicacion().obtenerCoordenadaX());
		assertEquals (-15, explorador2.verUbicacion().obtenerCoordenadaY());
		caza.vivir(listaDeMoviles,listaDeBotines);
		assertEquals (-15, caza.verUbicacion().obtenerCoordenadaX());
		assertEquals (-18, caza.verUbicacion().obtenerCoordenadaY());
		
	};
	
	
}
